﻿#include <iostream>
#include <vector>
using namespace std;
const int N = 1e6 + 10;
int n, q;
vector<int> a[N];
int main()
{
	cin >> n >> q;
	while (q--)
	{
		int op, i, j, k;
		cin >> op >> i >> j;
		if (op == 1)
		{
			cin >> k;
			if (a[i].size() <= j)
			{
				a[i].resize(j + 1);
			}
			a[i][j] = k;
		}
		else
		{
			cout << a[i][j] << endl;
		}
	}
	return 0;
}
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= n; i++)cin >> a[i];
//	while (m--)
//	{
//		int x;
//		cin >> x;
//		cout << a[x] << endl;
//	}
//	return 0;
//}
//#include <iostream>
//#include <vector>
//using namespace std;
//const int N = 10;
//struct node
//{
//	int a, b;
//	string s;
//};
//void print(vector<int>& a)
//{
//	// 利⽤size来遍历
//	// for(int i = 0; i < a.size(); i++)
//	// {
//	//     cout << a[i] << " ";
//	// }
//	// cout << endl;
//	// 利⽤迭代器来遍历-迭代器类型vector<int>::iterator
//	// for(auto it = a.begin(); it != a.end(); it++)
//	// {
//	//     cout << *it << " ";
//	// }
//	// cout << endl;
//	// 使⽤语法糖-范围for
//	for (auto x : a)
//	{
//		cout << x << " ";
//	}
//	cout << endl;
//}
//int main()
//{
//	// 1. 创建vector
//	vector<int> a1; // 创建了⼀个名字为a1的空的可变⻓数组，⾥⾯都是int类型的数据
//	vector<int> a2(N); // 创建了⼀个⼤⼩为10的可变⻓数组，⾥⾯的值默认都是0
//	vector<int> a3(N, 2); // 创建了⼀个⼤⼩为10的可变⻓数组，⾥⾯的值都初始化为2
//	vector<int> a4 = { 1, 2, 3, 4, 5 }; // 初始化列表的创建⽅式
//
//	// <> ⾥⾯可以存放任意的数据类型，这就体现了模板的作⽤，也体现了模板的强⼤之处
//	// 这样，vector⾥⾯就可以存放我们⻅过的所有的数据类型，甚⾄是STL本⾝
//	vector<string> a5; //存字符串
//	vector<node> a6; // 存结构体
//	vector<vector<int>> a7; // 创建了⼀个⼆维的可变⻓数组
//	vector<int> a8[N]; // 创建了⼀个⼤⼩为N的vector数组
//	// int a[N];
//	// 2. size / empty
//	// print
//	// print(a2);
//	// print(a3);
//	// print(a4);
//	// if(a2.empty()) cout << "空" << endl; // else cout << "不空" << endl; 
//	// 3. begin / end
//	// print
//	// print(a2);
//	// print(a3);
//	// print(a4);
//	// 4. 尾插以及尾删
//	// for(int i = 0; i < 5; i++)
//	// {
//	//     a1.push_back(i);
//	//     
//    // }print(a1);
//	// while(!a1.empty())
//	// {
//	//     print(a1);
//	//     
//   // }a1.pop_back();
//	// 5. front / back
//	// cout << a4.front() << " " << a4.back() << endl;
//	// 6. resize
//	vector<int> aa(5, 1);
//	print(aa);
//	// 扩⼤成10
//	aa.resize(10);
//	print(aa);
//	// 缩⼩成3
//	aa.resize(3);
//	print(aa);
//	// 7. clear
//	cout << aa.size() << endl;
//	aa.clear();
//	cout << aa.size() << endl;
//	return 0;
//}
//
////#include <vector> //头文件
////#include <string>
////#include<iostream>
////using namespace std;
//////如果不加引⽤，会拷⻉⼀份，时间开销很⼤
////void print(vector<int>& a)
////{
////	for (auto x : a)
////	{
////		cout << x << " ";
////	}
////	cout << endl;
////}
////// 7. clear
////void test_clear()
////{
////	vector<int> a(5, 1);
////	print(a);
////	a.clear();
////	cout << a.size() << endl;
////	print(a);
////}
////int main()
////{
////	test_clear();
////}
//////// 如果不加引用，会拷贝一份，时间开销很大
//////void print(vector<int>& a)
//////{
//////	for (auto x : a)
//////	{
//////		cout << x << " ";
//////	}
//////	cout << endl;
//////}
//////// 6. resize
//////void test_resize()
//////{
//////	vector<int> a(5, 1);
//////	a.resize(10); // 扩大
//////	print(a);
//////	a.resize(3); // 缩小
//////	print(a);
//////}
////// 5. ⾸元素和尾元素
//////int main()
//////{
//////	vector<int> a(5);
//////	for (int i = 0; i < 5; i++)
//////	{
//////		a[i] = i + 1;
//////		cout << a[i] << " ";
//////	}
//////	cout << endl;
//////	cout << a.front() << " " << a.back() << endl;
//////	return 0;
//////}
//////如果不加引⽤，会拷⻉⼀份，时间开销很⼤
//////void print(vector<int>& a)
//////{
//////	for (auto x : a)
//////	{
//////		cout << x << " ";
//////	}
//////	cout << endl;
//////}
//////// 4.添加和删除元素
//////void test_io()
//////{
//////	vector<int> a;
//////	//尾插1 2 3 4 5
//////	a.push_back(1);
//////	a.push_back(2);
//////	a.push_back(3);
//////	a.push_back(4);
//////	a.push_back(5);
//////	print(a);
//////	a.pop_back();
//////	a.pop_back();
//////	a.pop_back();
//////	print(a);
//////}
//////int main()
//////{
//////	vector<int> a;
//////	//尾插1 2 3 4 5
//////	a.push_back(1);
//////	a.push_back(2);
//////	a.push_back(3);
//////	a.push_back(4);
//////	a.push_back(5);
//////	print(a);
//////	a.pop_back();
//////	a.pop_back();
//////	a.pop_back();
//////	print(a);
//////}
//////const int N = 20;
//////struct node
//////{
//////	int a, b, c;
//////};
//////// 2. size
//////void test_size()
//////{
//////	// 创建⼀个⼀维数组
//////	vector<int> a1(6, 8);
//////	for (int i = 0; i < a1.size(); i++)
//////	{
//////		cout << a1[i] << " ";
//////	}
//////	cout << endl << endl;
//////	// 创建⼀个⼆维数组
//////	vector<vector<int>> a2(3, vector<int>(4, 5));
//////	for (int i = 0; i < a2.size(); i++)
//////	{
//////		// 这⾥的a2[i]相当于⼀个
//////		vector<int> a(4, 5);
//////		for (int j = 0; j < a2[i].size(); j++)
//////		{
//////			cout << a2[i][j] << " ";
//////		}
//////		cout << endl;
//////	}
//////	cout << endl << endl;
//////}
//////// 3. begin/end
//////void test_it()
//////{
//////	vector<int> a(10, 1);
//////	//迭代器的类型是vector<int>::iterator，但是⼀般使⽤auto简化
//////	for (auto it = a.begin(); it != a.end(); it++)
//////	{
//////		cout << *it << " ";
//////	}
//////	cout << endl << endl;
//////	// 使⽤语法糖-范围for遍历
//////	for (auto x : a)
//////	{
//////		cout << x << " ";
//////	}
//////	cout << endl << endl;
//////}
//////// 1.创建
//////int main()
//////{
//////	vector<int> a1; //创建⼀个空的可变⻓数组
//////	vector<int> a2(N); //指定好了⼀个空间，⼤⼩为N
//////	vector<int> a3(N, 10); // 创建⼀个⼤⼩为N的vector，并且⾥⾯的所有元素都是10
//////	vector<int> a4 = { 1, 2, 3, 4, 5 }; // 使⽤列表初始化，创建⼀个vector
//////	// <> ⾥⾯可以放任意的类型，这就是模板的作⽤，也是模板强⼤的地⽅
//////    // 这样，vector⾥⾯就可以放我们接触过的任意数据类型，甚⾄是STL
//////	vector<string> a5; // 放字符串
//////	vector<node> a6; // 放⼀个结构体
//////	vector<vector<int>> a7; // 甚⾄可以放⼀个⾃⼰，当成⼀个⼆维数组来使⽤。并且每⼀维都是可变的
//////	vector<int> a8[N]; // 创建N个vector
//////
//////	//print(a2);
//////	//print(a3);
//////	//print(a4);
//////
//////	//if (a1.empty())cout << "空" << endl;
//////	//else cout << "不空" << endl;
//////
//////
//////}